package jobs;

// 抽象状态类
abstract class DocumentState {
    public abstract void submit(Document doc);
    public abstract void download(Document doc);
}

// 待审核状态
class PendingState extends DocumentState {
    @Override
    public void submit(Document doc) {
        System.out.println("文档提交审核，进入审核中状态。");
        doc.setState(new ReviewingState());
    }
    @Override
    public void download(Document doc) {
        System.out.println("文档未通过审核，无法下载。");
    }
}

// 审核中状态
class ReviewingState extends DocumentState {
    @Override
    public void submit(Document doc) {
        System.out.println("文档正在审核，不能重复提交。");
    }
    @Override
    public void download(Document doc) {
        System.out.println("文档未通过审核，无法下载。");
    }
    // 审核通过操作（扩展）
    public void approve(Document doc) {
        System.out.println("文档审核通过，进入已通过状态。");
        doc.setState(new ApprovedState());
    }
}

// 已通过状态
class ApprovedState extends DocumentState {
    @Override
    public void submit(Document doc) {
        System.out.println("文档已通过审核，无需再次提交。");
    }
    @Override
    public void download(Document doc) {
        System.out.println("文档下载成功。");
    }
}

// 文档类
class Document {
    private DocumentState state;
    public Document() {
        this.state = new PendingState();
    }
    public void setState(DocumentState state) {
        this.state = state;
    }
    public void submit() {
        state.submit(this);
    }
    public void download() {
        state.download(this);
    }
    // 审核通过操作，只有在ReviewingState下有效
    public void approve() {
        if (state instanceof ReviewingState) {
            ((ReviewingState) state).approve(this);
        } else {
            System.out.println("当前状态不能执行审核通过操作。");
        }
    }
}

// 测试类
public class DocumentStateTest {
    public static void main(String[] args) {
        Document doc = new Document();
        System.out.println("--- 初始状态：待审核 ---");
        doc.download();
        doc.submit();
        System.out.println("--- 状态：审核中 ---");
        doc.submit();
        doc.download();
        doc.approve();
        System.out.println("--- 状态：已通过 ---");
        doc.submit();
        doc.download();
    }
}
